<!doctype html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<script>
    /*
    * 方法：一个方法，一般情况下，返回的数据类型，一定是相同的。（通用所有方法）
    *
    * 字符串的方法：
    *
    *   一 裁切：
    *
    * */

    //这里有几句话
    /*
    * 将一个字符串按逗号切分成多个片段 这些多个片段 可以放到一个数组里面
    *   split 方法 按要求切割，切割成多段
    *   .split()在括号中传入一个参数 裁切的标准（切割方式），注意这种方式裁剪后生成返回的是数组
    *
    *   let str = "好迪真好，你好我好大家好，广州好迪，"
    *   console.log(str.split(",")) //切割成三段放到一个数组中["好迪真好","你好我好大家好","广州好迪"]
    *
    *   let 排骨 = "肉1骨头肉2骨头肉3骨头肉4骨头"
    *   console.log(排骨.split("骨头")) //["肉1","肉2","肉3","肉4"]
    *   console.log(排骨) //排骨还是原先的排骨，不会有任何改变 因为永远无法修改字符串！
    *
    *   let str3 = "abc"
    *   console.log(str3.split("")) //传入一个空字符串 按空字符串形式切割
    *   //会打印["a"，"b","c"] 即将字符串按字符分隔转成数组
    *
    * */

    /*
    * 开发中的例子：
    *   访问网址的时候
    *   username=yinshi&password=9527&isAdmin=1
    *   get请求发送数据携带在 url中的?后面 以&分隔 每段数据用=分隔 前面时数据类型（键） 后面是数据的值（值）
    *
    *   后台处理这段数据，该怎么拿到数据？
    *   实现一个函数：format 整理数据 返回对象格式的数据
    *   {
    *       属性名：属性值，
    *   }
    *
    *   思考逻辑：
    *   函数功能：格式化数据
    *   输入：字符串
    *   输出：对象
    *
    * */
    let date = "username=yinshi&password=9527&isAdmin=1"
    function format(str){ //传入一个字符串类型的形参
        //根据上文可知 传入的字符串 会被按切割标准 裁切成一个数组 可以在函数内部先用一个arr先来接收数据
        let arr = str.split("&")
        //console.log(arr)//先验证一下有没有问题
        //因为返回的是一个数组 我们还需要对数组再进行加工 使其成为对象
        //所以我们应该先遍历数组 拿到每一个 数据片段 二次加工 可以想到使用for循环 但是后面还有一个作用域问题
        let result = {} //因为作用域的问题 先在for循环外面声明一个空对象 后面再使用 否则如果在for循环（{块级作用域}注意用的图标）内部声明变量
        //所形成的变量都只在{}中生效，我们最后return变量的时候就无法拿到{}中生成的变量 所以先声明 再在循环内部使用
        for(let i = 0,l = arr.length;i < l;i++){
            //第一次是整个字符串切割 这一次虽然是数组 但是它是由一个个字符串片段所组合在一起的数组  内部的每一项依旧是字符串 可以再次进行切割
            //用一个新变量来保存这个新切割好的数组
            let subArr = arr[i].split("=") //循环为数组中每一项进行裁切
            //subArr应该是什么结构？
            //console.log(subArr)
            //会打印出三段["username","yinshi"] ["password","9527"] ["isAdmin","1"]
            //将切分出来的内容 用对象格式进行排列 左边放属性名 右边放属性值
            result[subArr[0]] = subArr[1] //这时候就使用刚刚在for循环之外声明的对象来接收
            //对象[属性名]=属性值 (详见对象属性增加)

        }
        return result //最后在循环结束之后 将结果返回出来
    }

    /*
    *   二 裁剪：按位置裁剪 裁剪之后的字符串依旧是原先的字符串，照样无法修改字符串！
    *       .slice(s,e)：s表示开始位置下标 e表示结束位置下标，这个方法裁剪后生成的是字符串
    *       找到开始位置和结束位置 将中间部分提取出来
    *       s 从 s位开始 包含s位这个位置
    *       e 到 e位结束 不包含e位这个位置
    *
    *       截取的长度是多少？ e - s
    *
    *       可以只有一个参数：
    *       .slice(s) //表示从s位置一直截取到字符串结束
    *
    *       str = "9876543210"
    *       str.slice(3,6)
    *       //返回字符串"654"
    *
    *       str.slice(3,3) // 注意与str.slice(3,4)进行比较
    *       //前者返回一个空字符串""    后者返回字符串"6"
    *
    *       .slice()方法中参数如果出现负数 -1表示倒数第一位 -2表示倒数第二位 -3表示倒数第三位 -n表示倒数第n位
    * */

    /*
    *   三 裁剪：
    *       .substr(n,l) 传入两个参数 第一个参数n表示从第n位开始 第二个参数l表示截取多少位
    *                   n如果是负数，表示从倒数第n位开始
    *
    *       let str = "好迪真好，你好我好大家好，广州好迪"
    *       str.substr(2,3) //第二位开始，裁剪3个位数长度 返回字符串 "真好,"
    *
    *       str.substr(2,6) //第二位开始，裁剪6个位数长度 返回字符串 "真好,你好我"
    *
    *       .substring() 与 .slice 的区别
    *       参数都为正数时没有区别
    *       .substring前一位参数为负数时表示直接到字符串最前面开始 后一位参数为负数时表示往前面裁剪n位
    *
    * */




</script>
</body>
</html>